package com.tdam2011.grupo06.gui;

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;

import android.app.AlertDialog;
import android.app.Dialog;
import android.app.ListActivity;
import android.content.Intent;
import android.content.SharedPreferences;
import android.os.AsyncTask;
import android.os.Bundle;
import android.preference.PreferenceManager;
import android.view.LayoutInflater;
import android.view.Menu;
import android.view.MenuItem;
import android.view.SubMenu;
import android.view.View;
import android.view.ViewGroup;
import android.widget.BaseAdapter;
import android.widget.ImageView;
import android.widget.LinearLayout;
import android.widget.TextView;

import com.tdam2011.grupo06.R;
import com.tdam2011.grupo06.control.GestorConectividad;
import com.tdam2011.grupo06.gui.PullToRefreshListView.OnRefreshListener;
import com.tdam2011.grupo06.model.ItemConectividad;

public class ListadoConectividad extends ListActivity
{
	private LinearLayout linearLay;
	private ItemConectividadAdapter adapter;
	private CargarConectividadTask cargarDataTask;
	private GestorConectividad gestorConectividad;
	
	@Override
	protected void onCreate(Bundle savedInstanceState) 
	{
		super.onCreate(savedInstanceState);
		setContentView(R.layout.lista_conectividad);
		adapter = new ItemConectividadAdapter();
		gestorConectividad = new GestorConectividad(this);
		
		linearLay = (LinearLayout) findViewById(R.id.linearLayoutListaConectividad);
		setListAdapter(adapter);

		// Set a listener to be invoked when the list should be refreshed.
		((PullToRefreshListView) getListView()).setOnRefreshListener(new OnRefreshListener() {
		    @Override
		    public void onRefresh() {
		    	if(cargarDataTask!=null){
		    		cargarDataTask.cancel(true);
		    	}
		    	cargarDataTask = new CargarConectividadTask();
		    	cargarDataTask.execute("");
		    }
		});
		((PullToRefreshListView) getListView()).onRefresh();
	}
	
	public class ItemConectividadAdapter extends BaseAdapter 
	{
		private ArrayList<ItemConectividad> itemsConectividad;
		private LayoutInflater inflater;
		private int cant3G;
		private int cantWIFI;

		public ItemConectividadAdapter() 
		{
			itemsConectividad = new ArrayList<ItemConectividad>();
			inflater = LayoutInflater.from(ListadoConectividad.this);
			cant3G = 0;
			cantWIFI = 0;
		}

		public void addItemInfo(ItemConectividad info) {
			if (info != null) {
				itemsConectividad.add(info);
				
				if(info.getTipo()==ItemConectividad.tipo3G) {cant3G++;}
				else if(info.getTipo()==ItemConectividad.tipoWIFI) {cantWIFI++;}
			}
		}

		public int getCount() {
			return itemsConectividad.size();
		}

		public Object getItem(int position) {
			return itemsConectividad.get(position);
		}

		public long getItemId(int position) {
			return position;
		}
		
		public void ordenarConectividad(Comparator<ItemConectividad> c)
		{
			if(itemsConectividad.size()!=0)
			{
				Collections.sort(itemsConectividad, c);
			}
		}

		public void emptyLists()
		{
			itemsConectividad.clear();
			cant3G = 0;
			cantWIFI = 0;
		}
		
		public int getCant3G()
		{
			return cant3G;
		}
		
		public int getCantWIFI()
		{
			return cantWIFI;
		}
		
		class Holder 
		{
			private ImageView imgTipo;
			private TextView txtAccion;
			private TextView txtFecha;
		}

		public View getView(int position, View convertView, ViewGroup arg2) 
		{
			Holder holder;
			if (convertView == null) 
			{
				convertView = inflater.inflate(R.layout.item_conectividad, null);
				holder = new Holder();
				holder.imgTipo = (ImageView) convertView.findViewById(R.id.imageViewConectividad);
				holder.txtAccion = (TextView) convertView.findViewById(R.id.txtConectividadTipo);
				holder.txtFecha = (TextView) convertView.findViewById(R.id.txtConectividadFecha);
				convertView.setTag(holder);
			} 
			else 
			{
				holder = (Holder) convertView.getTag();
			}

			ItemConectividad info = (ItemConectividad) getItem(position);
			
			holder.imgTipo.setImageDrawable(info.getTipoDrawable(ListadoConectividad.this));
			holder.txtAccion.setText(info.getAccionString(ListadoConectividad.this));
			holder.txtFecha.setText(info.getFechaString());
			
			return convertView;
		}
	}
	
	@Override
	protected void onResume() 
	{
		super.onResume();
	}

	@Override
	protected void onPause() 
	{
		super.onPause();
	}

	@Override
	protected void onStop() 
	{
		super.onStop();
	}
	
	@Override
	public boolean onCreateOptionsMenu(Menu menu) 
	{
	    menu.add(Menu.NONE, 1, Menu.NONE, "Preferencias");
	    menu.add(Menu.NONE, 2, Menu.NONE, "Filtrar por");
	    SubMenu smnuOrd = menu.addSubMenu(Menu.NONE, Menu.NONE, Menu.NONE, "Ordenar por");
	    smnuOrd.add(Menu.NONE, 3, 1, "Fecha ascendente");
	    smnuOrd.add(Menu.NONE, 3, 2, "Fecha descendente");
	    smnuOrd.add(Menu.NONE, 3, 3, "Acci�n ascendente");
	    smnuOrd.add(Menu.NONE, 3, 4, "Acci�n descendente");
	    smnuOrd.add(Menu.NONE, 3, 5, "Tipo ascendente");
	    smnuOrd.add(Menu.NONE, 3, 6, "Tipo descendente");
	    smnuOrd.setGroupCheckable(Menu.NONE, true, true);
	    return true;
	}
	
	@Override
	public boolean onOptionsItemSelected(MenuItem item) 
	{
	    switch (item.getItemId()) 
	    {
	        case 1:
	        	startActivity(new Intent(this, SetPreferenceNombreUsuario.class).putExtra("NoInicio", true));
	            return true;
	        case 2:
	        	startActivityForResult(new Intent(this, SetPreferenceFiltrarConectividad.class),0);
	            return true;
	        case 3:
	        	SharedPreferences myPreference=PreferenceManager.getDefaultSharedPreferences(this);
	        	SharedPreferences.Editor editor = myPreference.edit();
	        	String[] order = getResources().getStringArray(R.array.ordenamietoConectividad);
	        	switch (item.getOrder()) 
	    	    {
	    	        case 1:
	    	        	editor.putString("ordenamietoConectividad", order[0]);
	    	        	adapter.ordenarConectividad(ItemConectividad.comparadorFechaAsc);
	    	            break;
	    	        case 2:
	    	        	editor.putString("ordenamietoConectividad", order[1]);
	    	        	adapter.ordenarConectividad(ItemConectividad.comparadorFechaDesc);
	    	            break;
	    	        case 3:
	    	        	editor.putString("ordenamietoConectividad", order[2]);
	    	        	adapter.ordenarConectividad(ItemConectividad.comparadorAccionAsc);
	    	            break;
	    	        case 4:
	    	        	editor.putString("ordenamietoConectividad", order[3]);
	    	        	adapter.ordenarConectividad(ItemConectividad.comparadorAccionDesc);
	    	            break;
	    	        case 5:
	    	        	editor.putString("ordenamietoConectividad", order[4]);
	    	        	adapter.ordenarConectividad(ItemConectividad.comparadorTipoAsc);
	    	            break;
	    	        case 6:
	    	        	editor.putString("ordenamietoConectividad", order[5]);
	    	        	adapter.ordenarConectividad(ItemConectividad.comparadorTipoDesc);
	    	            break;
	    	    }
	        	adapter.notifyDataSetChanged();
	            return editor.commit();
	        default:
	            return super.onOptionsItemSelected(item);
	    }
	}
	
	@Override
	public boolean onPrepareOptionsMenu(Menu menu)
	{
		SubMenu smnuOrd = menu.getItem(2).getSubMenu();
		SharedPreferences myPreference=PreferenceManager.getDefaultSharedPreferences(this);
    	String[] order = getResources().getStringArray(R.array.ordenamietoConectividad);
    	String orden = myPreference.getString("ordenamietoConectividad", "");
    	for (int i = 0; i<order.length; i++)
    	{
    		if(order[i].compareTo(orden)==0)
    		{
    			smnuOrd.getItem(i).setChecked(true);
    		}
    	}
	    return true;
	}
	
	private class CargarConectividadTask extends AsyncTask<String, Void, ItemConectividadAdapter> {
	    
	    protected void onPostExecute(ItemConectividadAdapter result) {
	    	if(result!=null)
			{
				adapter = result;
				adapter.notifyDataSetChanged();
			}

	    	if(linearLay.getVisibility()!=View.GONE){
	    		linearLay.setVisibility(View.GONE);
	    	}
	    	if(adapter.isEmpty()){
    			((PullToRefreshListView) getListView()).onRefreshComplete(getResources().getString(R.string.empty_listConectividad));
    		}
    		else{
    			((PullToRefreshListView) getListView()).onRefreshComplete(null);
    		}
	    	
	        super.onPostExecute(result);
	    }

		@Override
		protected ItemConectividadAdapter doInBackground(String... params) {
			boolean flag = gestorConectividad.verificarHistorial(adapter);
			
			if(flag)
			{
				adapter.emptyLists();
				return gestorConectividad.cargarHistorial(adapter);
			}
			return null;
		}
	}
	
	
	@Override
	protected void onActivityResult(int requestCode, int resultCode, Intent data) 
	{
		super.onActivityResult(requestCode, resultCode, data);
		if (requestCode == 0) 
		{
			if (data!=null)
			{
				gestorConectividad.actualizar();
				((PullToRefreshListView) getListView()).onRefresh();
			}
		}
	}
	
	protected Dialog onCreateDialog(int id) 
	{
		Dialog dialog = null;
		if (id ==1) 
		{
			dialog = new AlertDialog.Builder(this).setIcon(R.drawable.ic_alert).setPositiveButton("Ok", null).setMessage("Todavia no se ha cargado la conectividad").setTitle("Error").create();;
		} 
		else 
		{
			dialog = super.onCreateDialog(id);
		}
		return dialog;
	}
	
	@Override
	public void onBackPressed() 
	{
		super.onBackPressed();
	}

}